package com.common.activity.clip;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import com.common.widget.GlobalToast;
import com.starappallcommon.R;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Environment;
import android.text.TextUtils;
import android.text.format.Time;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.TextureView;
import android.view.View;

/**
 * 裁剪模块工具类
 * 
 * @ClassName:StarAppClipUtil
 * @Function: TODO ADD FUNCTION
 * @Reason: TODO ADD REASON
 * 
 * @author HuangYK
 * @version
 * @since Ver 1.1
 * @创建时间 2014-5-4 上午8:59:29
 * 
 * @see
 */
public final class StarAppClipUtil {
    
    /**
     * 
     * Creates a new instance of StarAppClipUtil.
     * <br>Created 2014-6-6 下午5:22:26
     */
    private StarAppClipUtil() {
        
    }
	/** 头像最大大小（存储空间大小） */
	public static final int MAX_AVATOR_LENGTH = 2048 * 100;

	/** 头像最大尺寸（高宽） */
	public static final int MAX_AVATOR_SIZE = 600;

	/** 裁剪头像临时文件 */
	public static final String TEMP_AVATOR_CLIP_NAME = "avator_clip.jpg";

	/**
	 * 重新设置Image的Matrix属性
	 * 
	 * @函数名称 :reSetImageMatrix
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @param matrix
	 *            矩阵
	 * @param bitmap
	 *            原图
	 * @param contentW
	 *            宽度
	 * @param contentH
	 *            高度
	 * @作者 : HuangYK
	 * @创建时间 : 2014-5-5上午11:37:00
	 */
	public static void reSetImageMatrix(Matrix matrix, Bitmap bitmap,
			int contentW, int contentH) {
		// 获得图片宽高
		float primaryW = bitmap.getWidth();
		float primaryH = bitmap.getHeight();
		float scaleX = (float) contentW / primaryW;
		float scaleY = (float) contentH / primaryH;

		// 原图放大倍数,默认3
		final float defaultScale = 3;
		float mBigScale = defaultScale;

		// 获取比例小的那方，然后放大图片
		// 图片比例
		float mScale = 0;
//		if (scaleX < scaleY) {
			mScale = scaleX;
//		} else {
//			mScale = scaleY;
//		}
		// 为了凑整
		final float rounding = 0.5f;

		if (mScale < 1 && 1 / mScale < mBigScale) {
			mBigScale = (float) (1 / mScale + rounding) / 2;
		}
		// 某一个点的X坐标
		float mSubX = (contentW - primaryW * mScale) / 2;
		// 某一个点的Y坐标
		float mSubY = (contentH - primaryH * mScale) / 2;
		matrix.postScale(mScale, mScale);
		matrix.postTranslate(mSubX, mSubY);
	}

	/**
	 * 前两个手指计算的中间点
	 * 
	 * @函数名称 :midPoint
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @param point
	 *            多点操作
	 * @param event
	 *            操作事件
	 * @作者 : HuangYK
	 * @创建时间 : 2014-5-4上午9:03:37
	 */
	public static void midPoint(PointF point, MotionEvent event) {
		float x = event.getX(0) + event.getX(1);
		float y = event.getY(0) + event.getY(1);
		point.set(x / 2, y / 2);
	}

	/**
	 * 确定两个手指之间的空间
	 * 
	 * @函数名称 :spacing
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @param event
	 *            操作事件
	 * @return float
	 * @作者 : HuangYK
	 * @创建时间 : 2014-5-4上午9:04:34
	 */
	public static float spacing(MotionEvent event) {
		float x = event.getX(0) - event.getX(1);
		float y = event.getY(0) - event.getY(1);
		return FloatMath.sqrt(x * x + y * y);
	}

	/**
	 * 获取屏幕状态栏高度
	 * 
	 * @函数名称 :getBarHeight
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @param activity
	 *            上下文
	 * @return int
	 * @作者 : HuangYK
	 * @创建时间 : 2014-5-4上午9:04:57
	 */
	public static int getBarHeight(Activity activity) {
		Rect frame = new Rect();
		activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
		return frame.top;
	}

	/**
	 * 获取屏幕截屏
	 * 
	 * @函数名称 :takeScreenShot
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @param activity
	 *            上下文
	 * @return Bitmap
	 * @作者 : HuangYK
	 * @创建时间 : 2014-5-4上午9:05:06
	 */
	public static Bitmap takeScreenShot(Activity activity) {
		View view = activity.getWindow().getDecorView();
		view.setDrawingCacheEnabled(true);
		view.buildDrawingCache();
		return view.getDrawingCache();
	}

	/**
	 * 根据URI解析出Bitmap
	 * 
	 * @函数名称 :decodeUriAsBitmap
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @param context
	 *            上下文
	 * @param uri
	 *            Bitmap URI
	 * @return Bitmap
	 * @作者 : HuangYK
	 * @创建时间 : 2014-5-4上午9:05:15
	 */
	public static Bitmap decodeUriAsBitmap(Context context, Uri uri) {
		Bitmap bitmap = null;
		try {
			bitmap = BitmapFactory.decodeStream(context.getContentResolver()
					.openInputStream(uri));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		}
		return bitmap;
	}

	/**
	 * 拍照临时文件
	 * 
	 * @函数名称 :getCameraTmpFile
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @return File
	 * @作者 : HuangYK
	 * @创建时间 : 2014-5-4上午9:06:43
	 */
	public static File getCameraTmpFile() {
		String tmpFilePath = getSotrePath();
		if(TextUtils.isEmpty(tmpFilePath)){
			return null;
		}
		return new File(tmpFilePath);
	}

	/**
	 * 根据系统时间生成图片名
	 * 
	 * <br>Created 2014-5-23 下午7:08:42
	 * @return 图片名称路径
	 * @author       chenqian
	 */
	public static String getSotrePath() {
		Time t = new Time();
		t.setToNow();

		boolean sdCardExist = Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
		if (!sdCardExist) {
			GlobalToast.showToast(R.string.no_sdcard_for_download, 0);
			return null;
		}
		String strDir = Environment.getExternalStorageDirectory()
				.getAbsolutePath() + "/DCIM/Camera/";
		File dir = new File(strDir);
		if (!dir.isDirectory()) {
			dir.mkdirs();
		}
		String strPath = strDir + "IMG_" + t.format("%Y%m%d_%H%M%S") + ".jpg";
		return strPath;
	}


	/**
	 * 压缩图片质量的方法，这里需要注意，只有JPG的图片才能压缩，PNG是无损图片，不能压缩其质量
	 * 
	 * @函数名称 :compressImage
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @param image
	 *            待压缩的图片
	 * @return Bitmap
	 * @作者 : HuangYK
	 * @创建时间 : 2014-5-4上午9:06:48
	 */
	public static Bitmap compressImage(Bitmap image) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		final int defaultOptions = 100;
		// 初始options
		int options = defaultOptions;
		// 每次减少个数
		final int offset = 10;
		// 质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
		image.compress(Bitmap.CompressFormat.JPEG, options, baos);
		// 循环判断如果压缩后图片是否大于100kb,大于继续压缩
		while (baos.toByteArray().length > MAX_AVATOR_LENGTH) {
			// 重置baos即清空baos
			baos.reset();// 这里压缩options%，把压缩后的数据存放到baos中
			image.compress(Bitmap.CompressFormat.JPEG, options, baos);
			options -= offset;// 每次都减少10
		}
		// 把压缩后的数据baos存放到ByteArrayInputStream中
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
		// 把ByteArrayInputStream数据生成图片
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
		return bitmap;
	}

	/**
	 * 压缩图片质量到200K以内并保存到本地，这里需要注意，只有JPG的图片才能压缩，PNG是无损图片，不能压缩其质量
	 * 
	 * @n<b>函数名称</b> :compressImageAndSave
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @param image
	 *            待压缩的图片
	 * @param path
	 *            图片存储路径
	 * @throws IOException
	 *             有可能会抛出IO异常，需要捕获
	 * @<b>作者</b> : HuangYK
	 * @<b>创建时间</b> : 2014-4-25下午5:04:42
	 */
	public static void compressImageAndSave(Bitmap image, String path, int max_length)
			throws IOException {

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		final int defaultOptions = 80;
		// 初始options
		int options = defaultOptions;
		// 每次减少个数
		final int offset = 10;
		// 质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
		image.compress(Bitmap.CompressFormat.JPEG, options, baos);
		// 循环判断如果压缩后图片是否大于100kb,大于继续压缩
		while (baos.toByteArray().length > MAX_AVATOR_LENGTH) {
			// 重置baos即清空baos
			baos.reset();// 这里压缩options%，把压缩后的数据存放到baos中
			image.compress(Bitmap.CompressFormat.JPEG, options, baos);
			options -= offset;// 每次都减少10
		}
		// 把压缩后的数据baos存放到ByteArrayInputStream中
//		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());

		OutputStream streamSave = new FileOutputStream(path);
		baos.writeTo(streamSave);
		baos.flush();
		baos.close();
		streamSave.flush();
		streamSave.close();
		
//		if (max_length <= 0) {
//			max_length = MAX_AVATOR_LENGTH;
//		}
//		OutputStream streamSave = new FileOutputStream(path);
//		final int default_quality = 100;
//		final int reduce = 10;
//		int quality = default_quality;
//		image.compress(Bitmap.CompressFormat.JPEG, quality, streamSave);
//		streamSave.flush();
//		streamSave.close();
//		while (new File(path).length() > max_length && quality > 0) {
//			quality -= reduce;
//			streamSave = new FileOutputStream(path);
//			image.compress(Bitmap.CompressFormat.JPEG, quality, streamSave);
//			streamSave.flush();
//			streamSave.close();
//		}
	}
}
